home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / IE7proSetup_2.3.exe / userscripts / RSS+AtomFeedSubscribeButtonGenerator.ieuser.js < prev    next >
Text File  |  2007-11-20  |  10KB  |  198 lines

  1. // ==UserScript==
  2. // @name         RSS+Atom Feed Subscribe Button Generator
  3. // @description  Finds RSS and/or Atom links on a page and inserts feed subscription links for use by aggregators
  4. // @namespace    http://loonyone.livejournal.com
  5. // @include      http://*
  6. // @include      https://*
  7. // @creator      Manpreet Singh |junkblocker<at>yahoo<dot>com|
  8. // @source       http://userscripts.org/scripts/show/688
  9. // @identifier   http://userscripts.org/scripts/source/688.user.js
  10. // @version      1.0
  11. // @date         2007-04-09
  12. // ==/UserScript==
  13.  
  14. // Version 1.0 - Added auto update without requiring an external script
  15. // Version 0.9 - Added a close button
  16. // Version 0.8 - Checks some wiki feeds with ?action=rss_rc and feeds with /rss/$ or /atom/$
  17. // Version 0.7 - Check for feedburner feeds
  18. // Version 0.6 - Fixed a major issue with using snapshotLength when it was not available
  19. // Version 0.5 - Updated contact info
  20. // Version 0.4 - Added optional auto-update facility
  21. // Version 0.3 - Added some speed optimizations
  22. // Version 0.2 - Merged Iain Brodfoot's floating div behaviour and removed purl.org links
  23. //             - Allow revert to old behaviour by hand editing this script
  24. // Version 0.1 - First release
  25.  
  26. /*
  27.  * Options contribution by Iain Broadfoot (ibroadfo@geeksoc.org)
  28.  * - remove link to purl
  29.  *   (Manually edit this script to restore old behaviour. See TWEAK NOTE 1 below)
  30.  * - Float the buttons to enable better behaviour on blogger/blogspot.com
  31.  *   (Manually edit this script to restore old behaviour. See TWEAK NOTE 2 below)
  32.  *
  33.  * Mostly lifted from
  34.  *   Generate RSS and ATOM tags: http://highbyte.bounceme.net/greasemonkey/genrsslinkrel.user.js
  35.  *   Amazon Atom Injector:       http://docs.g-blog.net/code/greasemonkey/amazon_xml_feeds.user.js
  36.  *   Add RSS Index:              http://www.xs4all.nl/~jlpoutre/BoT/Javascript/RSSpanel/rsspanel.user.js
  37.  */
  38.  
  39. (function () {
  40. /*
  41.   var SCRIPT_METADATA = {
  42.     name: 'RSS+Atom Feed Subscribe Button Generator',
  43.     url: 'http://userscripts.org/scripts/source/688.user.js',
  44.     version: "1.0",
  45.   };
  46.   function autoUpdate(SCRIPT) {
  47.     try {
  48.       if (!GM_getValue) return;
  49.       // avoid a flood of dialogs e.g. when opening a browser with multiple tabs set to homepage and a script with * includes
  50.       var DoS_PREVENTION_TIME = 2 * 60 * 1000;
  51.       var isSomeoneChecking = GM_getValue('CHECKING', null);
  52.       var now = new Date().getTime();
  53.       GM_setValue('CHECKING', now.toString());
  54.       if (isSomeoneChecking && (now - isSomeoneChecking) < DoS_PREVENTION_TIME) return;
  55.       var lastChecked = GM_getValue('LAST_CHECKED', null);
  56.  
  57.       var ONE_DAY = 24 * 60 * 60 * 1000;
  58.       if (lastChecked && (now - lastChecked) < ONE_DAY) return;
  59.       GM_xmlhttpRequest({
  60.         method: 'GET',
  61.         url: SCRIPT.url,
  62.         onload: function(result) {
  63.           if (!result.responseText.match(/@version\s+([\d.]+)/)) return;
  64.           var theOtherVersion = RegExp.$1;
  65.           if (theOtherVersion == SCRIPT.version) return;
  66.           if (window.confirm('A new version ' + theOtherVersion + ' of greasemonkey script "' + SCRIPT.name + '" is available.\nYour installed version is ' + SCRIPT.version + ' .\n\nUpdate now?\n')) {
  67.             GM_openInTab(aScriptURL);
  68.           }
  69.         }
  70.       });
  71.       GM_setValue('LAST_CHECKED', now.toString());
  72.     } catch (ex) {
  73.     }
  74.   }
  75.   autoUpdate(SCRIPT_METADATA);
  76. */
  77.  
  78.   var ATOM_ICON  = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAMAAAEzEIgrAAAAwFBMVEUiIiKZmZlmZmaIiIi7u7vMzMwzMzP5+fkRERHu7u6Wlpb9/f3KyspVVVXGxsb7+/t3d3fPz8/S0tLDw8P8/Py9vb2xsbG+vr6rq6u/v79ERETl5eXKq6vFxcXb29txcXGpqamysrLOzs6zu+J+fn4eHh56enoDHH7W1tb01NS3t7dSUlKrtN7ExMSzs7OapdXHx8e6urrLy8vAwMDHpaXMlZWstd/Jycm1veSurq6YmJibptXIyMgAAACIjXj///+BJyE6AAABVklEQVQ4y52T6VLbMBRGryRvIWSBhL0t0FL2rWXt8um8/1vxQ44xwemEfuOxRpqjoyvZMjUxBT1LMRKtNYqdI4gxmhACrKiIdUwA03WA1mBHjGDV4BdZ4RsSQ3LAMThiJEYiBgBf207SQoCA9TXO6m6zaBt0qBgr+wHfOFKmIMdMXz8JlKxCAthyQiRw3rhklgfr2oMHNkruu/cSZYDJZxJsAt+DcoVuMB8H9bTLNpegQrrQHEgCd4WQ/wk3DOXNVhaAmUwU+gLk/U5wVmPKDqOtptMBLn+OzGW1bkerG5O/nx74WOaFTvIAXG+XSb/3dkL8d2bCIFUmjV39TQ836/m/W5vpNcLUvn+/CnuDKqmc5BkdlPB48gf6+5LHZKyk+7JQmP7tRmhS8JKRSxqclnV9+cR1CxdoX4WQ9WaSbG8IwPTqc//9oS95hm+ztvN0ezcs+Z/oBckmBmW7bigcAAAAAElFTkSuQmCC" style="border:none;" />';
  79.   var RSS_ICON   = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAIAAAD8q9/YAAAA5ElEQVR4nOVWMQ7DIAw8V/krc5YMfUCGLp15LR1IHAvb0EopDNwEhzE+bAuAyUAAUkqjw+gEIlqOYaAb/MX0ej9v8PMfbOsO4DE6jN6YTvBSEvHsZ1nkmjTNBHL9AMhFvq27HkgDcxczxbRgPIfmEUowa4ipHEj91Z7nIOrw7kL7kUuesbmkbSzBOXssKVCbUQcXmTHBGWju0lVgei4cmsZWD2sZgS6RHqNCZAF1m292SaZyiZ5DyVgZxplDLmkmM35sYDjZa/anl/PMa+XNI3B9POZ4h4loumdpOsHT/aVHh9AdH916sSoQOJxpAAAAAElFTkSuQmCC" style="border:none;" />';
  80.   var RDF_ICON   = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAIAAAD8q9/YAAAA40lEQVR4nOVWoRbDIAy87PVf0TUVfEAFBs3XMsFGGUkA0RXBqfYIIUcSAFgMBCDGODuMh0BE2+fT0A3+QnTe3uDnPzj2E8BrdhhPYznBW02Ebz/nIh9hGFL9AEhFfuwn/ygNxFmZqX4rRnMoLsEEZxkhXno0Rlc70szaXnA/5ZBmLA5xG0lwSmD7GGvaOG+rzIjIGejO4lUgeq4cisZSD4+c2IbaZs7bLKBtMzKrZBqbqDksGSnDAAz9FPBIzqX4ytLim93tTy3niefKu0vgeniscQ8T0XLX0nKCl3tLzw7hcbwB232nKlQYcjEAAAAASUVORK5CYII=" style="border:none;" />';
  81.   var XML_ICON   = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAIAAAD8q9/YAAAA3klEQVR4nOVWuxKEIAzc3Piv1jYWfoCFjbVfyxU4EfMAbsaTgq1wCSGbBAHoDAQghNA6jJdARMM5HOkBf0fY9uUBP//BPK0APq3DeBvdCR4kcYSrvXlcJBVi/wCITT5Pqx6kBuYqZsSnYDyH5hZK8EinEqGHyQpwEHl4udB+0inP2JzSNkowYKjFPREVSkRlTHAFiqt0F5iehUPT2DrDnrBf/uTbvrCAvE3NqpTJJNFzmDL+GTbrrI1hJEIfHrN6xfPp1TzyWnlxC1wPjz7uYSLq7lrqTnB3b+nWIbyOLwOWtSLcWFU8AAAAAElFTkSuQmCC" style="border:none;" />';
  82.   var CLOSE_ICON = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAScwAAEnMBjCK5BwAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA1G8PgXAAAAFRJREFUOE9jZGBg+A/EZIP/5ACYpRC9aQzEY6ByGmjG5Qpkcbw2oxuAhY/f2TAN2FxClJ/xeIFGNpPtZ4pDm1CCISrAcBmCoZnEBA4PbSgDll6JpgF1Tx8yB8tBWgAAAABJRU5ErkJggg==" style="border:none;" />';
  83.  
  84.   // array to keep track of 'seen' feed links.
  85.   var seen = [];
  86.  
  87.   var fsbdiv = document.createElement("div");
  88.   fsbdiv.setAttribute("id", "XmlButtons");
  89.   fsbdiv.style.textAlign = "left";
  90.   fsbdiv.style.margin = "0px";
  91.   // top right bottom left
  92.   fsbdiv.style.padding = "0px 3px 0px 3px";
  93.   // TWEAK NOTE 1 START: Comment out the next three lines to disable the buttons from floating
  94.   fsbdiv.style.position = "fixed";
  95.   fsbdiv.style.top = "0px";
  96.   fsbdiv.style.zIndex = "99999";
  97.   // TWEAK NOTE 1 END
  98.  
  99.   // Get links already declared properly in <link> elements in <head>
  100.   function getProperlyDeclaredTag() {
  101.     var linkRelElems = document.getElementsByTagName("link");
  102.     var tlink;
  103.     var i = 0;
  104.  
  105.     while (tlink = linkRelElems[i++]) {
  106.       var thref = tlink.href;
  107.       var type = tlink.type;
  108.  
  109.       if (type && type.match(/.*\/rs[sd](\+xml)?$/)) {
  110.         addRssLinkTag(thref, RSS_ICON);
  111.       } else if (type && type.match(/.*\/atom\+xml$/)) {
  112.         addRssLinkTag(thref, ATOM_ICON);
  113.       } else if (type && type.match(/^text\/xml$/)) {
  114.         addRssLinkTag(thref, RSS_ICON);
  115.       }
  116.     }
  117.   }
  118.  
  119.   function getTagsFromAllLinkElements() {
  120.     if( !document.links ) {
  121.       document.links = document.getElementsByTagName("a");
  122.     }
  123.     var links = document.links;
  124.     for (var a = 0, len = links.length; a < len ; a++) {
  125.       var link = links[a];
  126.       linkhref = link.href;
  127.  
  128.       if (linkhref.match(/(^(feed|rss):|[\.\/]rss([\.\/]xml|\.aspx|\.jsp|\/)?$|\/node\/feed$|\/rss\/[a-z0-9]+$|\?(rss|xml|rdf)=|\?action=rss_rc$|feeds\.feedburner\.com\/[a-z0-9]+$)/i)) {
  129.         addRssLinkTag(linkhref, RSS_ICON);
  130.       } else if (linkhref.match(/.*\/atom(\.xml|\.aspx|\.jsp|\/)?$/)) {
  131.         addRssLinkTag(linkhref, ATOM_ICON);
  132.       } else if (linkhref.match(/\/feeds?\/[^.\/]*\.xml$|.*\/index\.xml$|feed\/msgs\.xml(\?num=\d+)?$/)) {
  133.         addRssLinkTag(linkhref, XML_ICON);
  134.       } else if (linkhref.match(/.*\.rdf$/)) {
  135.         addRssLinkTag(linkhref, RDF_ICON);
  136.       }
  137.     }
  138.   }
  139.  
  140.   function beenThere(linkhref) {
  141.     if (seen.length <= 0) return false;
  142.  
  143.     var href = linkhref.toLowerCase();
  144.     for (var i = seen.length-1; i >=0; --i) {
  145.       if (seen[i].toLowerCase() == href) return true;
  146.     }
  147.  
  148.     return false;
  149.   }
  150.  
  151.   function addRssLinkTag(linkhref, icon) {
  152.     if (beenThere(linkhref)) {
  153.       return;
  154.     } else {
  155.       seen.push(linkhref);
  156.     }
  157.  
  158.     var flink = document.createElement("a");
  159.     flink.innerHTML = icon;
  160.     // this service creates link for all known aggregators which support RSS subscription service via
  161.     // a URL
  162.     // TWEAK NOTE 2 START : Uncomment the second line (and optionally comment the first line) below to retore linking to purl.org pages for easy subscription in feed readers
  163.     flink.href = linkhref;
  164.     // flink.href = "http://purl.org/net/syndication/subscribe/?rss=" + linkhref;
  165.     // TWEAK NOTE 2 END
  166.     flink.alt = linkhref;
  167.     flink.title = linkhref;
  168.     fsbdiv.appendChild(flink);
  169.     fsbdiv.appendChild(document.createTextNode(" "));
  170.   }
  171.  
  172.   getProperlyDeclaredTag();
  173.   getTagsFromAllLinkElements();
  174.  
  175.   var body = document.getElementsByTagName("body")[0];
  176.   // insert the div only if something was found
  177.   if (seen.length > 0) {
  178.     var head = document.getElementsByTagName('head');
  179.     if (head && head[0]) {
  180.       var closeButton = document.createElement('a');
  181.       closeButton.innerHTML = CLOSE_ICON;
  182.       closeButton.href = 'javascript: closeFSB();';
  183.       closeButton.style.display = 'inline';
  184.       closeButton.style.cursor = 'pointer';
  185.       var s = document.createElement('script');
  186.       s.language='javascript';
  187.       s.type = 'text/javascript';
  188.       s.text = 'function closeFSB(){try{document.getElementById("XmlButtons").style.display="none"}catch(e){}}';
  189.       head[0].appendChild(s);
  190.     }
  191.     fsbdiv.insertBefore(closeButton, fsbdiv.firstChild);
  192.     setTimeout(function() {
  193.       body.insertBefore(fsbdiv, body.firstChild);
  194.     }, 333); // hack to workaround the duplicated content problem
  195.   }
  196. })();
  197.  
  198.